home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / dds.zip / DDS.PAS < prev   
Pascal/Delphi Source File  |  1993-01-04  |  5KB  |  124 lines

  1. PROGRAM DDS;
  2.  
  3.  {DDS shows a disk drive summary of all active drives, including bytes/sector,
  4.   sectors/cluster, number of clusters, bytes capacity, bytes available,
  5.   and working directory.  SUBSTituted "virtual" drives are not shown.
  6.  
  7.   (C) Copyright 1989, Earl F. Glynn, Overland Park, KS.  Compuserve 73257,3527.
  8.   All Rights Reserved.  Version 1.0, July 1989.  This Turbo Pascal 5.5 PROGRAM
  9.   may be freely distributed for non-commercial use.
  10.  
  11.   Information about the Disk Parameter Block and what I have termed the
  12.   "Drive Array" was found in the public domain program SYSID.PAS by
  13.   Steve Grant, Long Beach, CA.  I prefer to use RECORDs and pointers to
  14.   access this information instead of the MEM and MEMW Turbo Pascal "arrays".}
  15.  
  16.   USES DOS;  {AnyFile,DOSerror,FindFirst,FindNext,Intr,SearchRec}
  17.  
  18.   TYPE
  19.     DiskParameterBlockPointer = ^DiskParameterBlock;
  20.     DiskParameterBlock      =
  21.       RECORD                                        { offset }
  22.         misc1               :  BYTE;                {  0 $00 }
  23.         driveunit           :  BYTE;                {  1 $01 }
  24.         BytesPerSector      :  WORD;                {  2 $02 }
  25.         SectorsPerCluster   :  BYTE;                {  4 $04 }
  26.         ClusterToSectorShift:  BYTE;                {  5 $05 }
  27.         ReservedSectors     :  WORD;                {  6 $06 }
  28.         FATs                :  BYTE;                {  8 $08 }
  29.         RootDirectoryEntries:  WORD;                {  9 $09 }
  30.         FirstDataSector     :  WORD;                { 11 $0B }
  31.         Clusters            :  WORD;                { 13 $0D }
  32.         SectorsPerFAT       :  BYTE;                { 15 $0F }
  33.         RootDirectorySector :  WORD;                { 16 $10 }
  34.         DeviceHeader        :  pointer;             { 18 $12 }
  35.         MediaType           :  BYTE;                { 22 $16 }
  36.         Valid               :  BYTE;                { 23 $17 }
  37.         NextDPB             :  pointer              { 24 $18 }
  38.       END;
  39.  
  40.     DriveArrayPointer   = ^DriveArray;
  41.     DriveArray          =
  42.       RECORD
  43.         DefaultDirectory:  ARRAY[1..69] OF CHAR;   {ASCIIZ string}
  44.         DPB             :  DiskParameterBlockPointer;
  45.       END;
  46.  
  47.     DOSListOfLists      =
  48.       RECORD                                        { offset  }
  49.         FirstMCBSegment :  WORD;                    { -2 -$02 }
  50.         misc1           :  ARRAY[1..16] OF BYTE;    {  0  $00 }
  51.         MaxBytesPerBlock:  WORD;                    { 16  $10 }
  52.         misc2           :  ARRAY[1..4]  OF BYTE;    { 18  $12 }
  53.         BaseDA          :  DriveArrayPointer;       { 22  $16 }
  54.         misc3           :  ARRAY[1..7]  OF BYTE;    { 26  $1A }
  55.         LastDrive       :  BYTE                     { 33  $21 }
  56.       END;
  57.  
  58.   VAR
  59.     c      :  CHAR;
  60.     DA     :  DriveArrayPointer;
  61.     DirInfo:  SearchRec;
  62.     DPB    :  DiskParameterBlockPointer;
  63.     drive  :  WORD;
  64.     entries:  WORD;
  65.     i      :  WORD;
  66.     LoL    :  ^DOSListOfLists;
  67.     r      :  Registers;
  68.  
  69. BEGIN
  70.   r.AH := $52;
  71.   Intr ($21,r);                        {Undocumented DOS function}
  72.   LoL := Ptr(r.ES,r.BX-2);             {DOS List of Lists - 2}
  73.   DA := LoL^.BaseDA;
  74.   WRITELN ('Disk Drive Summary (Version 1, July 1989)');
  75.   WRITELN (' ':48,'Root Dir');
  76.   WRITELN ('       Bytes/                 B y t e s          Entries        Working');
  77.   WRITELN ('Drive  Cluster Clusters  Capacity  Available   Max  Current    Directory');
  78.   WRITELN ('-----  ------- --------  --------- ---------  ----- -------  -------------');
  79.   drive := 1;
  80.   REPEAT
  81.     DPB := DA^.DPB;
  82.     IF   DPB^.MediaType > 0
  83.     THEN BEGIN
  84.       WRITE (' ':2,DA^.DefaultDirectory[1]);
  85.       WITH DPB^ DO BEGIN
  86.         r.AH := $36;    {Do this first in case floppy disk was changed.}
  87.         r.DL := drive;  {Capacity and Available will be from same disk.}
  88.         Intr ($21,r);
  89.         WRITE   (BytesPerSector*(SectorsPerCluster+1):10,Clusters - 1:9,
  90.                  LONGINT(BytesPerSector)*(SectorsPerCluster+1)*
  91.                  (Clusters-1):12);
  92.         IF   r.AX = $FFFF
  93.         THEN WRITE ('offline':10)
  94.         ELSE WRITE (LONGINT(r.BX)*r.AX*r.CX:10);
  95.         WRITE (RootDirectoryEntries:6);
  96.         IF   r.AX = $FFFF
  97.         THEN WRITE ('offline':9)
  98.         ELSE BEGIN
  99.           entries := 0;   {count root directory entries}
  100.           FindFirst (DA^.DefaultDirectory[1]+':\*.*',AnyFile,DirInfo);
  101.           WHILE DOSerror = 0 DO BEGIN
  102.             INC (entries);
  103.             FindNext (DirInfo)
  104.           END;
  105.           WRITE (entries:7,' ':2)
  106.         END
  107.       END;
  108.       WRITE ('  ');
  109.       i := 1;
  110.       c := DA^.DefaultDirectory[i];
  111.       WHILE c > #$00 DO BEGIN
  112.         WRITE (c);
  113.         INC (i);
  114.         c := DA^.DefaultDirectory[i]
  115.       END;
  116.       WRITELN
  117.     END;
  118.     INC (drive);
  119.     DA := Ptr(Seg(DA^), Ofs(DA^)+$51)
  120.   UNTIL (Seg(DPB^.NextDPB^) = $FFFF) OR (drive > LoL^.LastDrive);
  121.   IF   drive <= LoL^.LastDrive
  122.   THEN WRITELN (' ':2,CHR(ORD('A')+LoL^.LastDrive-1),' is LASTDRIVE')
  123. END {DDS}.
  124.